package router

import (
	_ "Go-Easy/api/docs" // 导入swagger文档用的
	. "Go-Easy/api/service"
	. "Go-Easy/pkg/config"
	"Go-Easy/pkg/log"
	"github.com/gin-gonic/gin"
	"github.com/swaggo/files"
	ginSwagger "github.com/swaggo/gin-swagger"
	"net/http"
)

func NewRouter() *gin.Engine {
	gin.SetMode(Gin.GinMode)
	r := gin.New()

	//这里定义了一些中间件。中间件可以看作是拦截器，请求传入后，需要经过
	r.Use(gin.Logger())      //gin的默认log，默认输出是os.Stdout，即屏幕
	r.Use(log.MyGinlogger()) //自定义的日志记录,在方法执行完毕后记录在日志文件中
	r.Use(gin.Recovery())    //从任何panic中恢复，并在出现panic时返回http 500
	//r.Use(AUTH_API)          //api访问权限验证

	//只有在debug模式下才开启swagger
	if Gin.GinMode == "debug" {
		r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
	}

	/*------------------------------以下演示权限相关操作------------------------------*/
	r.POST("/auth/login", AUTH_Login)               //用户登录
	r.GET("/auth/jwt", AUTH_JWT)                    //获取JWT Token
	r.GET("/auth/jwt/parse/:token", AUTH_JWT_Parse) //解析JWT Token

	/*------------------------------以下演示限流相关操作------------------------------*/
	qps := r.Group("/qps") //所有具有通用中间件或相同路径前缀的路由都可以使用Group归在一起
	qps.Use(FlowRestrict)  //流量限制中间件，对此group下api访问都做限流
	qps.GET("/helloworld", HelloWorld)

	/*------------------------------以下演示文件相关操作------------------------------*/
	file := r.Group("/file")
	file.StaticFS("/static", http.Dir("../logs"))     //反向代理一个静态目录， 目录可以使用绝对/相对路径
	file.StaticFile("/log", "../logs/2023-06-13.log") //反向代理单个文件
	file.POST("/upload", FileUpload)                  //上传文件

	/*------------------------------以下演示GORM操作------------------------------*/
	r.GET("/user/list",GORM_Example1)

	return r
}
